package com.uva.dbcs.web.beans.gestionDeReservaAlquiler;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import com.uva.dbcs.gestionDeReservaAlquiler.despliegue.GestorAlquilerReservaLocal;
import com.uva.dbcs.gestionDeVehiculos.despliegue.GestorDeVehiculosLocal;
import com.uva.dbcs.gestionDeVehiculos.dominio.Fabricante;
import com.uva.dbcs.gestionDeVehiculos.dominio.Modelo;
import com.uva.dbcs.gestionDeVehiculos.dominio.Vehiculo;

@ViewScoped
@ManagedBean
public class HacerReservaBean {

	private static final String BUSQ_MOD = "Por Modelos";
	private static final String BUSQ_CAR = "Por características";

	private String[] tiposBusqueda = { BUSQ_MOD, BUSQ_CAR };

	private String tipoBusqueda = BUSQ_MOD;

	private String fabricanteSeleccionado;

	private List<String> fabricantesString;

	private boolean busqueda_modelo = true;

	private boolean busqueda_caracteristicas = false;

	private String modeloSeleccionadoString;

	private List<String> modelosString;

	private int costeMaximo;

	private int costeMinimo;

	private boolean gps;

	private int puertas;

	private Date fechaInicio;

	private Date fechaFin;

	private List<Fabricante> fabricantes;

	private List<Modelo> modelos;

	private List<Vehiculo> vehiculos_filtrados;
	
	private Vehiculo vehiculo_seleccionado;
	
	private int idUsuario;

	// inyecciones
	@EJB
	GestorDeVehiculosLocal gestorDeVehiculos;

	@EJB
	GestorAlquilerReservaLocal gestorAlquilerReserva;

	// metodos utilizados

	@PostConstruct
	public void init() {

		fabricantes = gestorDeVehiculos.getFabricantes();

		Collections.sort(fabricantes);

		fabricantesString = new ArrayList<String>();

		for (Fabricante f : fabricantes) {
			fabricantesString.add(f.getNombre());
		}

	}

	/**
	 * Se llama cada vez que se modifica un atributo en el combo de la vista
	 * para hacer reservas
	 */
	public void filtrarVehiculos() {
		System.out.println("actualizar");
		
		
		
		
		// obtener los modelos del fabricante
		
		
		System.out.println("fabricante change");

		if (fabricanteSeleccionado != null && !fabricanteSeleccionado.isEmpty()) {

			Fabricante seleccion = null;
			
			// buscamos el fabricante seleccionado, que será un string
			for (Fabricante f: fabricantes){
				
				if (f.getNombre().equals(fabricanteSeleccionado)){
					
					seleccion = f;
					break;
				}
			}
			
			seleccion = gestorDeVehiculos.refreshFabricante(seleccion);
			
			this.modelos = seleccion.getModelos();
			
			Collections.sort(this.modelos);
			
			this.modelosString = new ArrayList<String>();
			
			for (Modelo m: modelos){
				this.modelosString.add(m.getNombre());
			}
			
			
			
		} else {

			this.modelosString = null;
			this.modelos = null;
		}
		
		
		// en función del tipo de busqueda obtenemos unos vehículos u otros
		
		if (tipoBusqueda.equals(BUSQ_MOD)){
			
			// obtener el id del modelo seleccionado
			int idModelo = -1;
			
			if (modelos!=null){
			
				for (Modelo m: modelos){
					if (m.getNombre().equals(modeloSeleccionadoString)){
						idModelo = m.getIdmodelo();
					}
				}
			}
			
			vehiculos_filtrados = gestorAlquilerReserva.
					buscarVehiculosDisponibles(idModelo, fechaInicio, fechaFin);

		}else if(tipoBusqueda.equals(BUSQ_CAR)){
			
			int idFabricante = -1;
			
			for (Fabricante f: fabricantes){
				if (f.getNombre().equals(fabricanteSeleccionado)){
					idFabricante = f.getIdfabricante();
				}
			}
			
			vehiculos_filtrados = gestorAlquilerReserva.
					buscarVehiculosDisponibles(costeMaximo, costeMinimo, fechaInicio,
							fechaFin, gps, idFabricante, puertas);
			
			
		}
		
		System.out.println("Se han encontrado :"+vehiculos_filtrados.size());
	}

	public void cambiarForm() {
		System.out.println("cambiar form");

		if (tipoBusqueda.equals(BUSQ_MOD)) {
			busqueda_modelo = true;
			busqueda_caracteristicas = false;
		} else {
			busqueda_caracteristicas = true;
			busqueda_modelo = false;
		}
	}
	
	public void onElegirVehiculo(){
		System.out.println("vehiculo elegido");
	}
	
	public void onDesElegirVehiculo(){
		System.out.println("vehiculo des-elegido");
	}
	
	
	public void efectuarReserva(){
		System.out.println("Se va a efectuar la reserva");
		
		
		gestorAlquilerReserva.crearReserva(Calendar.getInstance().getTime(), 
				fechaInicio, fechaFin, idUsuario , vehiculo_seleccionado.getIdvehiculo());
		
		// mostrar mensaje de confirmacion
		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage("Reserva creada correctamente"));
		
		
	}

	// getter & setters
	public String[] getTiposBusqueda() {
		return tiposBusqueda;
	}

	public void setTiposBusqueda(String[] tiposBusqueda) {
		this.tiposBusqueda = tiposBusqueda;
	}

	public String getTipoBusqueda() {
		return tipoBusqueda;
	}

	public void setTipoBusqueda(String tipoBusqueda) {
		this.tipoBusqueda = tipoBusqueda;
	}

	public String getFabricanteSeleccionado() {
		return fabricanteSeleccionado;
	}

	public void setFabricanteSeleccionado(String fabricanteSeleccionado) {
		this.fabricanteSeleccionado = fabricanteSeleccionado;
	}

	public List<String> getFabricantesString() {
		return fabricantesString;
	}

	public void setFabricantesString(List<String> fabricantesString) {
		this.fabricantesString = fabricantesString;
	}

	public boolean isBusqueda_modelo() {
		return busqueda_modelo;
	}

	public void setBusqueda_modelo(boolean busqueda_modelo) {
		this.busqueda_modelo = busqueda_modelo;
	}

	public boolean isBusqueda_caracteristicas() {
		return busqueda_caracteristicas;
	}

	public void setBusqueda_caracteristicas(boolean busqueda_caracteristicas) {
		this.busqueda_caracteristicas = busqueda_caracteristicas;
	}

	public String getModeloSeleccionadoString() {
		return modeloSeleccionadoString;
	}

	public void setModeloSeleccionadoString(String modeloSeleccionadoString) {
		this.modeloSeleccionadoString = modeloSeleccionadoString;
	}

	public List<String> getModelosString() {
		return modelosString;
	}

	public void setModelosString(List<String> modelosString) {
		this.modelosString = modelosString;
	}

	public int getCosteMaximo() {
		return costeMaximo;
	}

	public void setCosteMaximo(int costeMaximo) {
		this.costeMaximo = costeMaximo;
	}

	public int getCosteMinimo() {
		return costeMinimo;
	}

	public void setCosteMinimo(int costeMinimo) {
		this.costeMinimo = costeMinimo;
	}

	public boolean isGps() {
		return gps;
	}

	public void setGps(boolean gps) {
		this.gps = gps;
	}

	public int getPuertas() {
		return puertas;
	}

	public void setPuertas(int puertas) {
		this.puertas = puertas;
	}

	public Date getFechaInicio() {
		return fechaInicio;
	}

	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	public Date getFechaFin() {
		return fechaFin;
	}

	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}

	public List<Fabricante> getFabricantes() {
		return fabricantes;
	}

	public void setFabricantes(List<Fabricante> fabricantes) {
		this.fabricantes = fabricantes;
	}

	public List<Modelo> getModelos() {
		return modelos;
	}

	public void setModelos(List<Modelo> modelos) {
		this.modelos = modelos;
	}

	public List<Vehiculo> getVehiculos_filtrados() {
		return vehiculos_filtrados;
	}

	public void setVehiculos_filtrados(List<Vehiculo> vehiculos_filtrados) {
		this.vehiculos_filtrados = vehiculos_filtrados;
	}

	public Vehiculo getVehiculo_seleccionado() {
		return vehiculo_seleccionado;
	}

	public void setVehiculo_seleccionado(Vehiculo vehiculo_seleccionado) {
		this.vehiculo_seleccionado = vehiculo_seleccionado;
	}

	public int getIdUsuario() {
		return idUsuario;
	}

	public void setIdUsuario(int idUsuario) {
		this.idUsuario = idUsuario;
	}

	
}
